/*************************************郑州精铖电力设备有限公司*****************************************************
** 通讯实验室-LoRa模块
** 研发部编写，工程专用
** 版权所有，盗版必究
************************************************文件描述***********************************************************
** 文件名：LoRa_Reg.c
** 描  述：LoRa 寄存器函数源文件
**
************************************************历史版本***********************************************************
** 作者：
** 日期：
** 版本：
**
************************************************使用版本***********************************************************
** 作者：李康
** 日期：20191203
** 版本：V1.0
**
**************************************************说明*************************************************************
**LoRa模块片选引脚定义----->   LoRa_CS
**LoRa模块片SPI总线句柄定义----->   hspi1
************************************http://www.jingchengdianli.com*************************************************/

/*************************************************库头文件*********************************************************/
/***********************************************底层驱动库头文件***************************************************/
#include <LoRa_App.h>
#include <LoRa_Dri.h>
#include <LoRa_Reg.h>
/**************************************************全局变量********************************************************/
extern tLoRaSettings LoRaSettings;
tSX1276LR* SX1276LR;

/***************************************************************************
* 函 数 名:  LoRaSetRFFrequency
* 函数功能:  LoRa模块设置载波频率
* 输    入:  freq 载波频率
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-12-03
****************************************************************************/
void LoRaSetRFFrequency( uint32_t freq )
{
    LoRaSettings.RFFrequency = freq;
    freq = ( uint32_t )( ( double )freq / ( double )FREQ_STEP );
    SX1276LR->FrfMsbReg = ( uint8_t )( ( freq >> 16 ) & 0xFF );
    SX1276LR->FrfMidReg = ( uint8_t )( ( freq >> 8 ) & 0xFF );
    SX1276LR->FrfLsbReg = ( uint8_t )( freq & 0xFF );
    SX1276WriteBuffer( LoRa_FrfMsb_Reg, &SX1276LR->FrfMsbReg, 3);
}

/***************************************************************************
* 函 数 名:  LoRaSetSpreadingFactor
* 函数功能:  LoRa模块设置扩频因子
* 输    入:  factor 扩频因子
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-12-03
****************************************************************************/
void LoRaSetSpreadingFactor( uint8_t factor )
{
    if( factor > 12 )
    {
        factor = 12;
    }
    else if( factor < 6 )
    {
        factor = 6;
    }

    if( factor == 6 )
    {
        LoRaSetNbTrigPeaks( 5 );
    }
    else
    {
        LoRaSetNbTrigPeaks( 3 );
    }
    SX1276Read( LoRa_ModemConfig2_Reg, &SX1276LR->ModemConfig2Reg );
    SX1276LR->ModemConfig2Reg = ( SX1276LR->ModemConfig2Reg & LoRa_ModemConfig2_SpreadingFactor_Mask ) | ( factor << 4 );
    SX1276Write( LoRa_ModemConfig2_Reg, SX1276LR->ModemConfig2Reg );
    LoRaSettings.SpreadingFactor = factor;
}

/***************************************************************************
* 函 数 名:  LoRaSetNbTrigPeaks
* 函数功能:  LoRa模块设置尖峰
* 输    入:  value 尖峰个数
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-12-03
****************************************************************************/
void LoRaSetNbTrigPeaks( uint8_t value )
{
    SX1276Read( 0x31, &SX1276LR->TestReserved31Reg );
    SX1276LR->TestReserved31Reg = ( SX1276LR->TestReserved31Reg& 0xF8 ) | value;
    SX1276Write(0x31, SX1276LR->TestReserved31Reg );
}
/***************************************************************************
* 函 数 名:  LoRaSetErrorCoding
* 函数功能:  LoRa模块设置纠错编码率
* 输    入:  value 纠错编码率
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-12-03
****************************************************************************/
void LoRaSetErrorCoding( uint8_t value )
{
    SX1276Read( LoRa_ModemConfig1_Reg, &SX1276LR->ModemConfig1Reg );
    SX1276LR->ModemConfig1Reg = ( SX1276LR->ModemConfig1Reg & LoRa_ModemConfig1_CodingRate_Mask ) | ( value << 1 );
    SX1276Write( LoRa_ModemConfig1_Reg, SX1276LR->ModemConfig1Reg );
    LoRaSettings.ErrorCoding = value;
}

/***************************************************************************
* 函 数 名:  LoRaSetPacketCrcOn
* 函数功能:  LoRa模块设置CRC校验模式
* 输    入:  enable CRC校验模式
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-12-03
****************************************************************************/
void LoRaSetPacketCrcOn( bool enable )
{
    SX1276Read( LoRa_ModemConfig2_Reg, &SX1276LR->ModemConfig2Reg );
    SX1276LR->ModemConfig2Reg = ( SX1276LR->ModemConfig2Reg & LoRa_ModemConfig2_RxPayloadCRC_Mask ) | ( enable << 2 );
    SX1276Write( LoRa_ModemConfig2_Reg, SX1276LR->ModemConfig2Reg );
    LoRaSettings.CrcOn = enable;
}

/***************************************************************************
* 函 数 名:  LoRaSetSignalBandwidth
* 函数功能:  LoRa模块设置带宽
* 输    入:  bw 带宽
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-12-03
****************************************************************************/
void LoRaSetSignalBandwidth( uint8_t bw )
{
    SX1276Read( LoRa_ModemConfig1_Reg, &SX1276LR->ModemConfig1Reg );
    SX1276LR->ModemConfig1Reg = ( SX1276LR->ModemConfig1Reg & LoRa_ModemConfig1_BW_MASK ) | ( bw << 4 );
    SX1276Write( LoRa_ModemConfig1_Reg, SX1276LR->ModemConfig1Reg );
    LoRaSettings.SignalBw = bw;
}

/***************************************************************************
* 函 数 名:  LoRaSetImplicitHeaderOn
* 函数功能:  LoRa模块设置隐式报头显示模式
* 输    入:  enable 隐式报头显示模式
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-12-03
****************************************************************************/
void LoRaSetImplicitHeaderOn( bool enable )
{
    SX1276Read( LoRa_ModemConfig1_Reg, &SX1276LR->ModemConfig1Reg );
    SX1276LR->ModemConfig1Reg = ( SX1276LR->ModemConfig1Reg & LoRa_ModemConfig1_ImplicitHeader_Mask ) | ( enable );
    SX1276Write( LoRa_ModemConfig1_Reg, SX1276LR->ModemConfig1Reg );
    LoRaSettings.ImplicitHeaderOn = enable;
}

/***************************************************************************
* 函 数 名:  LoRaSetSymbTimeout
* 函数功能:  LoRa模块设置接收超时时间
* 输    入:  value 接收超时时间
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-12-03
****************************************************************************/
void LoRaSetSymbTimeout( uint16_t value )
{
    SX1276ReadBuffer( LoRa_ModemConfig2_Reg, &SX1276LR->ModemConfig2Reg, 2 );
    SX1276LR->ModemConfig2Reg = ( SX1276LR->ModemConfig2Reg & LoRa_ModemConfig2_SymbTimeoutMSB_Mask ) | ( ( value >> 8 ) & ~LoRa_ModemConfig2_SymbTimeoutMSB_Mask );
    SX1276LR->SymbTimeoutLsbReg = value & 0xFF;
    SX1276WriteBuffer( LoRa_ModemConfig2_Reg, &SX1276LR->ModemConfig2Reg, 2 );
}

/***************************************************************************
* 函 数 名:  LoRaSetPayloadLength
* 函数功能:  LoRa模块设置负载长度
* 输    入:  value 负载长度
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-12-03
****************************************************************************/
void LoRaSetPayloadLength( uint8_t value )
{
    SX1276LR->PayloadLengthReg = value;
    SX1276Write( LoRa_PayloadLength_Reg, SX1276LR->PayloadLengthReg );
    LoRaSettings.PayloadLength = value;
}

/***************************************************************************
* 函 数 名:  LoRaSetLowDatarateOptimize
* 函数功能:  LoRa模块设置低速率优化模式
* 输    入:  enable低速率优化模式
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-12-03
****************************************************************************/
void LoRaSetLowDatarateOptimize( bool enable )
{
    SX1276Read(LoRa_ModemConfig3_Reg, &SX1276LR->ModemConfig3Reg );
    SX1276LR->ModemConfig3Reg = ( SX1276LR->ModemConfig3Reg & LoRa_ModemConfig3_LowDataRateOptimize_Mask ) | ( enable << 3 );
    SX1276Write(LoRa_ModemConfig3_Reg, SX1276LR->ModemConfig3Reg );
}

/***************************************************************************
* 函 数 名:  LoRaSetPAOutput
* 函数功能:  LoRa模块设置功率输出
* 输    入:  outputPin   功率输出
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-12-03
****************************************************************************/
void LoRaSetPAOutput( uint8_t outputPin )
{
    SX1276Read( LoRa_PaConfig_Reg, &SX1276LR->PaConfigReg );
    SX1276LR->PaConfigReg = (SX1276LR->PaConfigReg & LoRa_PaConfig_PaSelect_Mask ) | outputPin;
    SX1276Write( LoRa_PaConfig_Reg, SX1276LR->PaConfigReg );
}

/***************************************************************************
* 函 数 名:  LoRaSetPa20dBm
* 函数功能:  LoRa模块设置大功率输出模式
* 输    入:  enale  大功率输出模式
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-12-03
****************************************************************************/
void LoRaSetPa20dBm( bool enale )
{
    SX1276Read( LoRa_PaDac_Reg, &SX1276LR->PaDacReg );
    SX1276Read( LoRa_PaConfig_Reg, &SX1276LR->PaConfigReg );

    if( ( SX1276LR->PaConfigReg & LoRa_PaConfig_PaSelect_Paboost ) == LoRa_PaConfig_PaSelect_Paboost )
    {
        if( enale == true )
        {
            SX1276LR->PaDacReg = 0x87;
        }
    }
    else
    {
        SX1276LR->PaDacReg = 0x84;
    }
    SX1276Write(LoRa_PaDac_Reg, SX1276LR->PaDacReg);
}

/***************************************************************************
* 函 数 名:  LoRaSetRFPower
* 函数功能:  LoRa模块设置射频功率
* 输    入:  power  射频功率
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-12-03
****************************************************************************/
void LoRaSetRFPower(int8_t power)
{
    SX1276Read( LoRa_PaConfig_Reg, &SX1276LR->PaConfigReg );
    SX1276Read( LoRa_PaDac_Reg, &SX1276LR->PaDacReg );

    if( (SX1276LR->PaConfigReg & LoRa_PaConfig_PaSelect_Paboost) == LoRa_PaConfig_PaSelect_Paboost )
    {
        if( ( SX1276LR->PaDacReg & 0x87 ) == 0x87 )
        {
            if( power < 5 )
            {
                power = 5;
            }
            if( power > 20 )
            {
                power = 20;
            }
            SX1276LR->PaConfigReg = ( SX1276LR->PaConfigReg & LoRa_PaConfig_Max_Power_Mask ) | 0x70;
            SX1276LR->PaConfigReg = ( SX1276LR->PaConfigReg & LoRa_PaConfig_Outputpower_Mask ) | ( uint8_t )( ( uint16_t )( power - 5 ) & 0x0F );
        }
        else
        {
            if( power < 2 )
            {
                power = 2;
            }
            if( power > 17 )
            {
                power = 17;
            }
            SX1276LR->PaConfigReg = ( SX1276LR->PaConfigReg & LoRa_PaConfig_Max_Power_Mask ) | 0x70;
            SX1276LR->PaConfigReg = ( SX1276LR->PaConfigReg & LoRa_PaConfig_Outputpower_Mask ) | ( uint8_t )( ( uint16_t )( power - 2 ) & 0x0F );
        }
    }
    else
    {
        if( power < -1 )
        {
            power = -1;
        }
        if( power > 14 )
        {
            power = 14;
        }
        SX1276LR->PaConfigReg = ( SX1276LR->PaConfigReg & LoRa_PaConfig_Max_Power_Mask ) | 0x70;
        SX1276LR->PaConfigReg = ( SX1276LR->PaConfigReg & LoRa_PaConfig_Outputpower_Mask ) | ( uint8_t )( ( uint16_t )( power + 1 ) & 0x0F );
    }
    SX1276Write( LoRa_PaConfig_Reg, SX1276LR->PaConfigReg );
    LoRaSettings.Power = power;
}

/***************************************************************************
* 函 数 名:  LoRaSetPreambleLength
* 函数功能:  LoRa模块设置前导码长度
* 输    入:  value  前导码长度
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-12-03
****************************************************************************/
void LoRaSetPreambleLength(uint16_t value)
{
    SX1276ReadBuffer( LoRa_PreambleMsb_Reg, &SX1276LR->PreambleMsbReg, 2 );
    SX1276LR->PreambleMsbReg = ( value >> 8 ) & 0x00FF;
    SX1276LR->PreambleLsbReg = value & 0xFF;
    SX1276WriteBuffer( LoRa_PreambleMsb_Reg, &SX1276LR->PreambleMsbReg, 2 );
}

/***************************************************************************
* 函 数 名:  LoRaSetHopPeriod
* 函数功能:  LoRa模块设置载波段
* 输    入:  power  射频功率
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-12-03
****************************************************************************/
void LoRaSetHopPeriod(uint8_t value)
{
    SX1276LR->HopPeriodReg = value;
    SX1276Write( LoRa_HopPeriod_Reg, SX1276LR->HopPeriodReg );
    LoRaSettings.HopPeriod = value;
}

/***************************************************************************
* 函 数 名:  LoRaSetPaRamp
* 函数功能:  LoRa模块设置斜率爬升系数
* 输    入:  value  斜率爬升系数
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-12-03
****************************************************************************/
void LoRaSetPaRamp(uint8_t value)
{
    SX1276Read( LoRa_PaRamp_Reg, &SX1276LR->PaRampReg );
    SX1276LR->PaRampReg = ( SX1276LR->PaRampReg & LoRa_PaRamp_Mask ) | ( value & ~LoRa_PaRamp_Mask );
    SX1276Write( LoRa_PaRamp_Reg, SX1276LR->PaRampReg );
}

